#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void test1()
{
    // 1. 未置为 NULL
    int *ptr = (int *)malloc(sizeof(int));
    free(ptr);
    printf("ptr=0x%x\n", ptr); // ptr=0xa665a0
    *ptr = 10;
    printf("ptr=%d\n", *ptr); // 10
    /*
   尽管 ptr 还保留着地址，然而这块内存已经被释放，系统可能
   随时把它分配给其他程序或者操作使用。所以对这块已经释放的内存
   进行读写操作，会引发不可预测的后果，像程序崩溃、数据损坏或者输出随机值等。
   */
}

void test2()
{
    // 2. 未初始化的指针，为野指针
    int *ptr2;
    int value = *ptr2;
    printf("value=%d\n", value);
}

void test3()
{
    // 3. 指针越界
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr3 = arr;

    // 报错，因为ptr已经越界
    ptr3 += 10;
    printf("ptr3=%d\n", *ptr3);
    // *ptr3 = 1;
}

void test4()
{
    char *p = NULL;
    char *p1 = (char *)malloc(10);
    if (!p1)
    {
        printf("error\n");
        return;
    }
    printf("p1=%s\n", p1);

    memset(p1, 0, 10);
    printf("p1=%s\n", p1);

    strcpy(p1, "hello");
    printf("p1=%s\n", p1);

    free(p1);
    p1 = NULL;
}

int main()
{
    test4();
    printf("====\n");
    test1();
    printf("====\n");
    test2();
    printf("====\n");
    test3();

    return 0;
}